From a966fe1ed5b5e633af05c2968960dbd870e89912 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Fri, 29 Mar 2019 11:07:04 +0100 Subject: [PATCH] broadway: Keep track of surface owner and only send input to that client --- gdk/broadway/broadway-server.c | 42 +++++++++++++++++++++++++++++++++- gdk/broadway/broadway-server.h | 1 + gdk/broadway/broadwayd.c | 2 +- 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/gdk/broadway/broadway-server.c b/gdk/broadway/broadway-server.c index b8bfe8b1d0..dc6f965db0 100644 --- a/gdk/broadway/broadway-server.c +++ b/gdk/broadway/broadway-server.c @@ -115,6 +115,7 @@ struct BroadwayInput { }; struct BroadwaySurface { + guint32 owner; gint32 id; gint32 x; gint32 y; @@ -471,9 +472,46 @@ process_input_message (BroadwayServer *server, BroadwayInputMsg *message) { gint32 client; + BroadwaySurface *surface; update_event_state (server, message); - client = -1; + + + switch (message->base.type) { + case BROADWAY_EVENT_ENTER: + case BROADWAY_EVENT_LEAVE: + case BROADWAY_EVENT_POINTER_MOVE: + case BROADWAY_EVENT_BUTTON_PRESS: + case BROADWAY_EVENT_BUTTON_RELEASE: + case BROADWAY_EVENT_SCROLL: + case BROADWAY_EVENT_GRAB_NOTIFY: + case BROADWAY_EVENT_UNGRAB_NOTIFY: + surface = broadway_server_lookup_surface (server, message->pointer.event_surface_id); + break; + case BROADWAY_EVENT_TOUCH: + surface = broadway_server_lookup_surface (server, message->touch.event_surface_id); + break; + case BROADWAY_EVENT_CONFIGURE_NOTIFY: + surface = broadway_server_lookup_surface (server, message->configure_notify.id); + break; + case BROADWAY_EVENT_ROUNDTRIP_NOTIFY: + surface = broadway_server_lookup_surface (server, message->roundtrip_notify.id); + break; + case BROADWAY_EVENT_KEY_PRESS: + case BROADWAY_EVENT_KEY_RELEASE: + /* TODO: Send to keys focused clients only... */ + case BROADWAY_EVENT_FOCUS: + case BROADWAY_EVENT_SCREEN_SIZE_CHANGED: + default: + surface = NULL; + break; + } + + if (surface) + client = surface->owner; + else + client = -1; + if (is_pointer_event (message) && server->pointer_grab_surface_id != -1) client = server->pointer_grab_client_id; @@ -2020,6 +2058,7 @@ broadway_server_ungrab_pointer (BroadwayServer *server, guint32 broadway_server_new_surface (BroadwayServer *server, + guint32 client, int x, int y, int width, @@ -2029,6 +2068,7 @@ broadway_server_new_surface (BroadwayServer *server, BroadwaySurface *surface; surface = g_new0 (BroadwaySurface, 1); + surface->owner = client; surface->id = server->id_counter++; surface->x = x; surface->y = y; diff --git a/gdk/broadway/broadway-server.h b/gdk/broadway/broadway-server.h index 859464aa45..f11e9e872d 100644 --- a/gdk/broadway/broadway-server.h +++ b/gdk/broadway/broadway-server.h @@ -86,6 +86,7 @@ gint32 broadway_server_get_mouse_surface (BroadwayServer * void broadway_server_set_show_keyboard (BroadwayServer *server, gboolean show); guint32 broadway_server_new_surface (BroadwayServer *server, + guint32 client, int x, int y, int width, diff --git a/gdk/broadway/broadwayd.c b/gdk/broadway/broadwayd.c index a3b402f1f6..54d97c5ec1 100644 --- a/gdk/broadway/broadwayd.c +++ b/gdk/broadway/broadwayd.c @@ -234,7 +234,7 @@ client_handle_request (BroadwayClient *client, { case BROADWAY_REQUEST_NEW_SURFACE: reply_new_surface.id = - broadway_server_new_surface (server, + broadway_server_new_surface (server, client->id, request->new_surface.x, request->new_surface.y, request->new_surface.width, -- 2.30.2